-- CALC_COMBAT_END_BONUS

-----------------------------------------------
--  根据积分计算战斗统计奖励
-- @param  user     玩家
-- @param  score    战斗统计总积分
return function(user, score)
    -- 获取地牢所需体力
    local dugeonId = DungeonM.getDungeonId();
    if dugeonId == nil then
        dugeonId = user.dbase:query("currentDungeon");
    end

    local layer_fix = DungeonAreaM.query(dugeonId, "layer_fix");
    local dungeonType = DungeonAreaM.query(dugeonId, "type");

    -- 天空副本，积分奖励为0
    if "sky_instance" == dungeonType then
        score = 0;
    end

    local money = math.modf((layer_fix + 8) * score / 50);
    local exp   = math.modf((layer_fix + 5) * score / 150);

    -- 计算额外增加%结算金币
    local prop = PropM.combine(user, "clearing_money", "money");
    money = PropM.apply(prop, money);

    -- 计算额外增加%结算经验
    prop = PropM.combine(user, "clearing_money", "exp");
    exp = PropM.apply(prop, exp);

    -- 计算额外增加结算金币
    prop = PropM.combine(user, "clearing_money2", "money");
    money = PropM.apply(prop, money);

    -- 计算额外增加结算经验
    prop = PropM.combine(user, "clearing_money2", "exp");
    exp = PropM.apply(prop, exp);

    -- 如果包裹中有冒险者符石，可额外获得金币
    if ItemM.getAmount(user, 7161) > 0 or ItemM.getAmount(user, 7186) > 0 then
        -- 注：如果此处修改了金币的数量，请同步修改公式：RISKER_STONE_COMPOUD_DESC
        if NewbieDungeonM.isFirstNewbieBonus("risker_stone") then
            -- 首次奖励
            money = money + 5000;
            NewbieDungeonM.statNewbieFirstBonus("risker_stone");
        else
            money = money + 500;
        end
    end

    -- 结算的奖励信息
    local bonus = {
        { 2, "money", money, },
        { 2, "exp", exp, },
    };

    -- 极特殊情况下最后一层没有解救到slime，在结算时给予奖励
    -- 该小关卡已经通关
    if DungeonAreaM.isDungeonPassed(user,id) then
        -- 获取玩家当前所在的层,该层可解救的slime
        local layer = user.dbase:query("max_dungeon_layer", 0);
        local classId = DungeonAreaM.query(dugeonId, "slime")[layer];

        if classId == 'number' then
            -- 如果玩家还没有该英雄
            if not user.pets[classId] then
                table.insert(bonus, { 3, classId, 1, });
            end
        end
    end

    local gem = 0;

    -- 计算额外增加结算钻石
    local prop = PropM.combine(user, "clearing_money2", "gem");
    gem = PropM.apply(prop, gem);

    if gem > 0 then
        table.insert(bonus, { 2, "gem", gem, });
    end

    -- 结算获得额外物品
    local props = PropM.fetchProps(user, "clearing_money2");
    for _, prop in ipairs(props) do
        if type(prop[2]) == "number" then
            table.insert(bonus, { 1, prop[2], prop[3], });
        end
    end

    -- 计算包裹中的装备产生的结算奖励
    -- 注：根据equip.csv表中配置的combat_stat_bonus计算
    local equipBonus = EquipM.calcCombatStatBonus();
    bonus = table.append(bonus, equipBonus);

    -- 计算道具产生的结算奖励
    -- 注：根据property.csv表中配置的combat_stat_bonus计算
    local propertyBonus = PropertyM.calcCombatStatBonus();
    bonus = table.append(bonus, propertyBonus);

    -- 如果已经满级，不能再获得经验
    if user:getLevel() >= MAX_USER_LEVEL then
        for _, arr in ipairs(bonus) do
            if arr[2] == "exp" then
                arr[3] = 0;
            end
        end
    end

    -- 合并同类奖励
    return BonusM.combineBonus(bonus);
end
